package design.patterns;

/**
 * @Desc:   聚合和组合的区别
 *      1.聚合(Aggregation) 关系是关联关系的一种，是强的关联关系。聚合是整体和个体之间的关系。例如，汽车类与引擎类、轮胎类，
 *          以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样，聚合关系也是通过实例变量实现的。但是关联关系所涉
 *          及的两个类是处在同一层次上的，而在聚合关系中，两个类是处在不平等层次上的，一个代表整体，另一个代表部分
 *      2.组合(Composition) 关系是关联关系的一种，是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象
 *          的生命周期，组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活，在一些情况下将负责代表部分的对象湮
 *          灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象，由后者负责此对象的生命周期。换言之，代表部分的对象在
 *          每一个时刻只能与一个对象发生组合关系，由后者排他地负责生命周期。部分和整体的生命周期一样。
 *      3.以上关系的耦合度依次增强（关于耦合度的概念将在以后具体讨论，这里可以暂时理解为当一个类发生变更时，对其他类造成的影
 *          响程度，影响越小则耦合度越弱，影响越大耦合度越强）。由定义我们已经知道，依赖关系实际上是一种比较弱的关联，聚合
 *          是一种比较强的关联，而组合则是一种更强的关联，所以笼统的来区分的话，实际上这四种关系、都是关联关系。
 *      4.聚合关系是是一种比较强的关联关系，java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系。例如上例中
 *
 *      class Driver {
 *          //使用成员变量形式实现聚合关系
 *          Car mycar;
 *          public void drive(){
 *              mycar.run();
 *          }
 *      }
 *      5.假如给上面代码赋予如下语义：车是一辆私家车，是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。
 *      6.假如赋予如下语义：车是司机的必须有的财产，要想成为一个司机必须要先有辆车，车要是没了，司机也不想活了。而且司机要是不干司机了，这个车就砸了，别人谁也别想用。那就表示组合关系了。一般来说，为了表示组合关系，常常会使用构造方法来达到初始化的目的，例如上例中，加上一个以Car为参数的构造方法
 *      public Driver(Car car){
 *          mycar = car;
 *      }
 *      7.所以，关联、聚合、组合只能配合语义，结合上下文才能够判断出来，而只给出一段代码让我们判断是关联，聚合，还是组合关系，则是无法判断的。
 *
 *      ****************************************************************************************************************
 *
 *      组合和聚合是有很大区别的，这个区别不是在形式上，而是在本质上：
 *      比如A类中包含B类的一个引用b，当A类的一个对象消亡时，b这个引用所指向的对象也同时消亡（没有任何一个引用指向它，成了垃圾对象），
 *          这种情况叫做组合，反之b所指向的对象还会有另外的引用指向它，这种情况叫聚合。
 *      在实际写代码时组合方式一般会这样写：
 *      A类的构造方法里创建B类的对象，也就是说，当A类的一个对象产生时，B类的对象随之产生，当A类的这个对象消亡时，它所包含的B类的对象也随之消亡。
 *      聚合方式则是这样：
 *          A类的对象在创建时不会立即创建B类的对象，而是等待一个外界的对象传给它传给它的这个对象不是A类创建的。
 *      现实生活中：人和人和手，脚是组合关系，因为当人死亡后人的手也就不复存在了。人和他的电脑是聚合关系。
 *      class Hand{ } class Computer{ }
 *      组合：
 *      class Person{
 *          private Hand hand; public Person(){
 *              hand = new Hand();
 *          }
 *      }
 *      聚合：
 *      class Person{
 *          private Computer computer; public setComputer(){
 *              computer = new Computer();
 *          }
 *      }
 * @author: cww
 * @DateTime: 2019-05-02 21:35
 */

public class RelationTheory {
}
